// Rust 声明式宏 - 匹配表达式详解

// 1. 最基本的宏定义
macro_rules! say_hello {
    () => {
        println!("Hello, Macro World!");
    };
}

// 2. 简单参数匹配
macro_rules! add {
    // 匹配两个表达式
    ($x:expr, $y:expr) => {
        {
            $x + $y
        }
    };
}

// 3. 多模式匹配
macro_rules! calculate {
    // 匹配加法
    ($x:expr + $y:expr) => {
        $x + $y
    };
    // 匹配减法
    ($x:expr - $y:expr) => {
        $x - $y
    };
    // 匹配乘法
    ($x:expr * $y:expr) => {
        $x * $y
    };
}

// 4. 重复模式匹配
macro_rules! create_function {
    // 使用 + 表示一个或多个重复
    // 使用 * 表示零个或多个重复
    ($($name:ident),+) => {
        $(
            fn $name() {
                println!("Function {} called", stringify!($name));
            }
        )+
    };
}

// 5. 复杂的匹配模式
macro_rules! map {
    // 空映射
    () => {
        std::collections::HashMap::new()
    };
    // 单个键值对
    ($($key:expr => $value:expr),+ $(,)?) => {
        {
            let mut map = std::collections::HashMap::new();
            $(
                map.insert($key, $value);
            )+
            map
        }
    };
}

fn main() {
    // 使用示例
    say_hello!(); // 无参数宏

    let sum = add!(10, 20); // 简单参数匹配
    println!("Sum: {}", sum);

    let result1 = calculate!(5 + 3); // 加法
    let result2 = calculate!(10 - 4); // 减法
    let result3 = calculate!(6 * 7); // 乘法
    println!("Results: {}, {}, {}", result1, result2, result3);

    // 创建多个函数
    create_function!(foo, bar, baz);
    foo();
    bar();
    baz();

    // 创建映射
    let empty_map = map![];
    let simple_map = map!["key" => 42];
    let complex_map = map![
        "name" => "Rust",
        "version" => "1.65",
        "awesome" => true
    ];
}